<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>迭代器</title>
</head>
<body>
    <script>
        //目前所有的内置可迭代对象如下：String、Array、TypedArray、Map 和 Set，因为它们的原型对象都拥有一个 Symbol.iterator 方法。
        const arr = ["zero", "one", "two"];
        //1、通过一个Symbol.iterator键去迭代
        let iterator = function(target){
            let it = target[Symbol.iterator]()
            ,result;
            while(!(result = it.next()).done){
                console.log(result)
            }
        }
        iterator(arr);

        //2、通过for of 迭代
        for(var value of arr){
            console.log(value)
        }

        //实现对象迭代器
        function createIterator(obj) {
            let index = 0
            ,keys = Object.keys(obj)
            return {
                next:()=>{
                    let name = keys[index],result; 
                    result = {value:obj[name],name:name,done:index < keys.length ? false : true}
                    return index++,result;
                }
                ,[Symbol.iterator]:function(){return this;}
                //Symbol.iterator属性对应一个函数,返回一个包含next方法的对象。（遍历器对象）
            };
        }

        let obj = createIterator({name:"ck",age:12,sex:'male'});
        iterator(obj);
        /**
         * 生成器不能被重用，iterator调用后，下面for of 将无法被执行
         * 正确方式应重新创建生成器
         * 
        */
        for(var value of obj){
            console.log(value)
        }
        
    </script>
</body>
</html>